var util = require('util.js');

module.exports = {
    uniqueId: '',

    /**
     * 全局请求函数
     * 1、加入错误提醒
     * 2、options加入 failStatus 回调函数，在successs函数中status不为0时回调，函数返回false不自动提醒错误
     * 3、options加入 successReload 布尔值，true则success完全掉原有success函数
     * 4、options加入 failRollback 布尔值，true则发生错误时回退到页面栈中的前一个页面
     * 5、options加入 notAuthParam 布尔值，true则url不加入身份验证参数
     * 6、options加入 baseUrl 字符串，false则完整路径，不写并且url不以http开头则默认使用setting.url
     * 7、options加入 isShowLoading 布尔值，是否显示加载提醒框,默认true
     */
    request: function (method, url, options) {
        var that = this;
        //设置默认头部
        var header = options.header ? options.header : { "content-type": "application/x-www-form-urlencoded" };
        //设置请求方式并做相应处理
        method = method.toUpperCase();
        var data = (method != 'GET' && options.data) ? util.json2Form(options.data) : options.data;
        //处理请求url
        url = this.modifyUrl(url, options);
        //是否显示加载图标
        options.isShowLoading = typeof options.isShowLoading == 'undefined' ? true : options.isShowLoading;
        options.isShowLoading && this.showLoading();
        wx.request(Object.assign({}, options, {
            url: url,
            method: method,
            data: data,
            header: header,
            success: function (res) {
                options.isShowLoading && that.hideLoading();
                that.doSuccess(options, res);
            },
            fail: function (res) {
                options.isShowLoading && that.hideLoading();
                that.doFail(options, res);
            }
        }));
    },

    /** get请求,说明同request() */
    get: function (url, options) {
        this.request('GET', url, options);
    },
    
    /** post请求,说明同request() */
    post: function (url, options) {
        this.request('POST', url, options);
    },

    /** 上传文件,说明同request(),在formData中附加参数,详看wx.uploadFile文档 */
    uploadFile: function (url, options) {
        var that = this
        url = this.modifyUrl(url, options);
        options.isShowLoading = typeof options.isShowLoading == 'undefined' ? true : options.isShowLoading;
        options.isShowLoading && this.showLoading();
        wx.uploadFile(Object.assign({}, options, {
            url: url,
            filePath: options.filePath,
            name: options.name,
            success: function (res) {
                that.hideLoading();
                res.data = JSON.parse(that.filterJsonData(res.data)); 
                that.doSuccess(options, res);
            },
            fail: function (res) {
                that.hideLoading();
                that.doFail(options, res);
            }
        }));
    },
	uploadFile1: function (url, options) {
	    var that = this
	    url = this.modifyUrl(url, options);
	    options.isShowLoading = typeof options.isShowLoading == 'undefined' ? true : options.isShowLoading;
	    options.isShowLoading && this.showLoading();
	    wx.uploadFile(Object.assign({}, options, {
	        url: url,
	        filePath: options.filePath,
			name: 'shop_images',
	        success: function (res) {
	            that.hideLoading();
	            res.data = JSON.parse(that.filterJsonData(res.data)); 
	            that.doSuccess(options, res);
	        },
	        fail: function (res) {
	            that.hideLoading();
	            that.doFail(options, res);
	        }
	    }));
	},
    /******* 以下是内部函数 *******/

    /** 请求成功的处理函数 */
    doSuccess: function (options, res) {
        if (typeof res.data !== 'object' && res.data.indexOf('该应用已被冻结') != -1) {
            this.showError('该应用已被冻结', options);
            return false;
        } else if (typeof res.data !== 'object' && res.data.indexOf('应用已过期') != -1){
            this.showError('该应用已过期', options);
            return false;
        }

        if (options.successReload == true) {
            typeof options.success == 'function' && options.success(res);
            return;
        }
        if (res.statusCode != 200) {

            if (504 == res.statusCode || 503 == res.statusCode) {
                this.showError('网络繁忙，请重试', options);
                return false;
            }

            this.showError('请求出错[' + res.statusCode + ']', options);
            return false;
        }
        if (res.data.status != 1) {
            if (typeof options.failStatus == 'function') {
                if (options.failStatus(res) == false) {
                    return false;
                }
            }
            /** token异常 */
            if (res.data.status == -100 || res.data.status == -101 || res.data.status == -102) {
                var app = getApp();
                app.auth.clearAuth();
                app.showTextWarining(res.data.msg, function () {
                    var pages = getCurrentPages();
                    if (pages[pages.length - 1].route != 'pages/user/index/index') {
                        wx.navigateTo({ url: '/pages/user/index/index' });
                    } else {
                        wx.reLaunch({ url: '/pages/index/index/index' });
                    }
                }, null, true);
                return false;
            }
            var showMsg = (typeof res.data.msg == 'string') ? res.data.msg : '数据格式错误';
            this.showError(showMsg, options);
            return false;
        }
        typeof options.success == 'function' && options.success(res);
    },

    /** 请求失败的处理函数 */
    doFail: function (options, res) {
        if (typeof options.fail == 'function') {
            if (options.fail(res) == false) {
                return false;
            }
        }
        this.showError('请求失败', options);
    },

    /** 过滤一些莫名其妙产生的奇葩字符 */
    filterJsonData: function (data) {
        var tmp = data; 
        for (var i = 0; i < data.length; i++) {
            tmp = data.substr(i);
            if (data.charAt(i) == '{') {
                break;
            }
        }
        return tmp;
    },

    /** 加基地址,附加鉴权参数 */
    modifyUrl: function (url, options) {
        typeof options == 'undefined' && (options = {});
        if (url.indexOf('http') != 0) {
            if (typeof options.baseUrl == 'string') {
                url = options.baseUrl + url;
            } else if (typeof options.baseUrl == 'undefined') {
                var app = getApp();
                url = app.globalData.setting.url + url;
            }
        }
        if (typeof options.notAuthParam == 'boolean' && options.notAuthParam == true) {
            return url;
        }
        var params = 'is_json=1'
                     + '&unique_id=' + this.getUniqueId()
                     + '&user_id=' + this.getUserId()
                     + '&token=' + this.getToken()
                     + '&oauth=miniapp';
        url += ((url.indexOf('?') > 0) ? '&' : '?') + params;
        return url;
    },

    /** 获取token */
    getToken: function () {
        var app = getApp();
        if (app.globalData.userInfo == null) {
            return '';
        }
        return app.globalData.userInfo.token;
    },

    /** 获取userId */
    getUserId: function () {
        var app = getApp();
        if (app.globalData.userInfo == null) {
            return '';
        }
        return app.globalData.userInfo.user_id;
    },

    /** 获取uniqueid，作用相当于sessionid */
    getUniqueId: function () {
        if (wx.getStorageSync('unique_id')) {
            return wx.getStorageSync('unique_id');
        } else {
            if (this.uniqueId) {
                return this.uniqueId;
            }
            this.uniqueId = 'miniapp' + util.randomString(17);
            return this.uniqueId;
        } 
    },

    /** 检查uniqueid状态 */
    checkUniqueId: function () {
        //未授权登录添加的商品,缓存unique_id，方便用户未授权下次用此该身份，授权登录后就清空
        if (!this.getToken()) {
            wx.setStorageSync('unique_id', this.getUniqueId())
        }
    },
    showLoading: function () {
        wx.showLoading({
            title: '加载中',
            mask:true,
        });
    },

    hideLoading: function () {
        wx.hideLoading();
    },

    showError: function (msg, options) {
        wx.showModal({
            title: msg,
            showCancel: false,
            complete: function () {
                options.failRollback == true && wx.navigateBack();
            }
        });
    }

};